/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package BusinessCase;

import CRUD.UsuarioFacadeLocal;
import entity.Dato;
import entity.Inddeuda;
import entity.Permiso;
import entity.Preferencia;
import entity.Trm;
import entity.Usuario;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

/**
 *
 * @author Yolima
 */

@Stateless
@Path("/Datos")
public class Datos {

    /*Datos a mostrar al usuario para escoger;
     * 
DTF 0
TRM 1 * // esta es la que es cada minuto
DEUDA 2 * -->
INFLACION 3
IPC 4
TIB 5
Mercado Cambiario 6 * -->
     */
@EJB   private UsuarioFacadeLocal usuarioFacade;
       private EntityManager em; 


@GET
@Produces(MediaType.TEXT_PLAIN)
     /*llamar despues del acceso y despliegue de la lista de datos a escoger, 
      pidiendo antes las opciones del tipo de dato y el formato
    * "Datos;Grafica;Archivo PDF;Video";  //0:datos, 1: grafica, 3: pdf, 4: video 
              */
    public String listarDatos(@QueryParam("usuario") Usuario usuario, @QueryParam("opcionDato") int opcionDato,@QueryParam("opcionF")int opcionF ) 
    {
        Date fechaAct=new Date();
        String respuesta="";
        List<Permiso> perm =  usuario.getPermisoList();
        /*
         * permiso 1 = a todo
         * permiso 2 = publico
         * permiso 3 = a privado depsues de un tiempo
         */
        for(int i=0;i<perm.size();i++)
        {
            if(perm.get(i).getIdpermiso()==new BigInteger("1"))
            {           
                if((opcionDato==1))
                {   
                    try
                    {
                        Query q = em.createQuery("select max(idTrm) from TRM");
                        int deuda = Integer.valueOf(String.valueOf(q.getSingleResult()));
                        q = em.createQuery("select t FROM TRM t WHERE idTrm = :id");
                        q.setParameter("id", deuda);
                        Trm trm = (Trm)q.getSingleResult();
                        respuesta = "Valor (%): "+trm.getValor();

                        if(opcionF==0)
                         {
                             //formato
                            q = em.createQuery("select f.idFormato FROM TRM d, Dato dt, Formato f WHERE dt.id=d.Dato_id AND f.id=dt.id AND d.idTrm= :trm");
                            q.setParameter("trm", trm.getTrmPK());
                            int idFormato = Integer.valueOf(String.valueOf(q.getSingleResult()));
                            q = em.createQuery("UPDATE Formato SET nombre=':nombre' WHERE idFormato = :id");
                            q.setParameter("nombre", "dato");
                            q.setParameter("id", idFormato);
                            int resp = q.executeUpdate();  
                            
                         }
                        if(opcionF==1)
                         {
                            q = em.createQuery("select f.idFormato FROM TRM d, Dato dt, Formato f WHERE dt.id=d.Dato_id AND f.id=dt.id AND d.idTrm= :trm");
                            q.setParameter("trm", trm.getTrmPK());
                            int idFormato = Integer.valueOf(String.valueOf(q.getSingleResult()));
                            q = em.createQuery("UPDATE Formato SET nombre=':nombre' WHERE idFormato = :id");
                            q.setParameter("nombre", "grafica");
                            q.setParameter("id", idFormato);
                            int resp = q.executeUpdate();  
                            respuesta="";
                         }
                        if(opcionF==2)
                         {
                            //pdf no hay pdf 
                         }
                        if(opcionF==3)
                         {
                            q = em.createQuery("select f.idFormato FROM TRM d, Dato dt, Formato f WHERE dt.id=d.Dato_id AND f.id=dt.id AND d.idTrm= :trm");
                            q.setParameter("trm", trm.getTrmPK());
                            int idFormato = Integer.valueOf(String.valueOf(q.getSingleResult()));
                            q = em.createQuery("UPDATE Formato SET nombre=':nombre' WHERE idFormato = :id");
                            q.setParameter("nombre", "video");
                            q.setParameter("id", idFormato);
                            int resp = q.executeUpdate();   
                            respuesta="";
                         }
                        //preferencia
                            //si ya existe la preferencia sumarla
                            q = em.createQuery("Select dt FROM TRM d, Dato dt WHERE dt.id=d.Dato_id AND d.idTrm= :trm");
                            q.setParameter("trm", trm.getTrmPK());
                            Dato dt = (Dato)q.getSingleResult();
                            q = em.createQuery("Select p FROM Preferencia p, Dato dt WHERE dt.id=p.id AND d.id= :id");
                            q.setParameter("id", dt.getIddato());
                            Preferencia p1 = (Preferencia)q.getSingleResult();
                            if(!p1.getPrioridad().equals(0))
                            {
                                int veces = Integer.valueOf(String.valueOf(p1.getPrioridad()))+Integer.valueOf(String.valueOf(1));
                                p1.setPrioridad(new BigInteger(String.valueOf(veces)));
                                q = em.createQuery("Update Preferencia SET prioridad WHERE idPreferencia= :id");
                                q.setParameter("id", p1.getPreferenciaPK().getIdpreferencia());
                                q.executeUpdate();
                            }
                            else
                            {      //preferencia nueva                      
                                Preferencia p = new Preferencia();
                                q = em.createQuery("select max(idPreferencia) from Preferencia");
                                int pref = Integer.valueOf(String.valueOf(q.getSingleResult()));//ponerlo automático en la db
                                pref ++;//ponerlo automático en la db
                                p.setPrioridad(new BigInteger(String.valueOf(pref)));//ponerlo automático en la db
                                p.setTipo("despliegue");
                                p.setPrioridad(new BigInteger(String.valueOf(1)));
                                p.setUsuario(usuario);                            
                                p.setIddato(dt);
                            }
                        }catch(NoResultException e) 
                        {
                            System.out.println(e.toString());
                        }
                }                  
            }
            if(perm.get(i).getIdpermiso()==new BigInteger("1"))
            {
                if((opcionDato==0)||(opcionDato==3)||(opcionDato==4)||(opcionDato==5))
                {
                    respuesta="OK";
                }
            }
            if(perm.get(i).getIdpermiso()==new BigInteger("1"))
            {
                Date fechaDat=new Date();    
                if((opcionDato==0)||(opcionDato==3)||(opcionDato==4)||(opcionDato==5))
                {
                    respuesta="OK";
                }
                if((opcionDato==2))
                {    
                    try
                    {
                        Query q = em.createQuery("select max(idIndDeuda) from IndDeuda");
                        int deuda = Integer.valueOf(String.valueOf(q.getSingleResult()));
                        q = em.createQuery("select i FROM Inddeuda i WHERE idIndDeuda = :id");
                        q.setParameter("id", deuda);
                        Inddeuda deudaD = (Inddeuda)q.getSingleResult();
                        String fechaD=deudaD.getFecha().toString();
                        try {
                            fechaDat= DateFormat.getInstance().parse(fechaD);// traer el tiempo de publicación del dato
                        } catch (ParseException ex) {
                            Logger.getLogger(Datos.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        double tiempo=fechaDat.getTime()-fechaAct.getTime();
                        if((tiempo==0)||(tiempo<0))
                        {
                            respuesta = "Titulo: "+deudaD.getTipotitulo()+"\nUltima tasa: "+deudaD.getUltimatasa()+"\nTasa promedio: "+deudaD.getTasapromedio();
                            if(opcionF==0)
                             {

                                 q = em.createQuery("select f.idFormato FROM IndDeuda d, Dato dt, Formato f WHERE dt.id=d.Dato_id AND f.id=dt.id AND d.idIndDeuda= :deuda");
                                 q.setParameter("deuda", deudaD.getInddeudaPK());
                                 int idFormato = Integer.valueOf(String.valueOf(q.getSingleResult()));
                                 q = em.createQuery("UPDATE Formato SET nombre=':nombre' WHERE idFormato = :id");
                                 q.setParameter("nombre", "dato");
                                 q.setParameter("id", idFormato);
                                 int resp = q.executeUpdate();
                             }   
                             if(opcionF==1)
                             {
                                 //grafica
                                 q = em.createQuery("select f.idFormato FROM IndDeuda d, Dato dt, Formato f WHERE dt.id=d.Dato_id AND f.id=dt.id AND d.idIndDeuda= :deuda");
                                 q.setParameter("deuda", deudaD.getInddeudaPK());
                                 int idFormato = Integer.valueOf(String.valueOf(q.getSingleResult()));
                                 q = em.createQuery("UPDATE Formato SET nombre=':nombre' WHERE idFormato = :id");
                                 q.setParameter("nombre", "grafica");
                                 q.setParameter("id", idFormato);
                                 int resp = q.executeUpdate();
                                 respuesta = "";
                             }
                             if(opcionF==2)
                             {
                                 respuesta = "";//no hay pdf
                             }
                             if(opcionF==3)
                             {
                                 //video
                                 q = em.createQuery("select f.idFormato FROM IndDeuda d, Dato dt, Formato f WHERE dt.id=d.Dato_id AND f.id=dt.id AND d.idIndDeuda= :deuda");
                                 q.setParameter("deuda", deudaD.getInddeudaPK());
                                 int idFormato = Integer.valueOf(String.valueOf(q.getSingleResult()));
                                 q = em.createQuery("UPDATE Formato SET nombre=':nombre' WHERE idFormato = :id");
                                 q.setParameter("nombre", "video");
                                 q.setParameter("id", idFormato);
                                 int resp = q.executeUpdate();
                                 respuesta = "";
                             }
                             //preferencia
                            //si ya existe la preferencia sumarla
                            q = em.createQuery("Select dt FROM Deuda d, Dato dt WHERE dt.id=d.Dato_id AND d.idIndDeuda= :id");
                            q.setParameter("id", deudaD.getInddeudaPK());
                            Dato dt = (Dato)q.getSingleResult();
                            q = em.createQuery("Select p FROM Preferencia p, Dato dt WHERE dt.id=p.id AND d.id= :id");
                            q.setParameter("id", dt.getIddato());
                            Preferencia p1 = (Preferencia)q.getSingleResult();
                            if(!p1.getPrioridad().equals(0))
                            {
                                int veces = Integer.valueOf(String.valueOf(p1.getPrioridad()))+Integer.valueOf(String.valueOf(1));
                                p1.setPrioridad(new BigInteger(String.valueOf(veces)));
                                q = em.createQuery("Update Preferencia SET prioridad WHERE idPreferencia= :id");
                                q.setParameter("id", p1.getPreferenciaPK().getIdpreferencia());
                                q.executeUpdate();
                            }
                            else
                            {      //preferencia nueva                      
                                Preferencia p = new Preferencia();
                                q = em.createQuery("select max(idPreferencia) from Preferencia");
                                int pref = Integer.valueOf(String.valueOf(q.getSingleResult()));//ponerlo automático en la db
                                pref ++;//ponerlo automático en la db
                                p.setPrioridad(new BigInteger(String.valueOf(pref)));//ponerlo automático en la db
                                p.setTipo("despliegue");
                                p.setPrioridad(new BigInteger(String.valueOf(1)));
                                p.setUsuario(usuario);                            
                                p.setIddato(dt);
                            }
                        }
                        else
                        {
                            respuesta="Debe esperar "+tiempo/60000+" minutos para poder ver este dato, vuelva a internartlo mas tarde";
                        }     
                     }catch(NoResultException e) 
                        {
                            System.out.println(e.toString());
                        }
                }                               
            }        
        }        
        return respuesta;
    }
}
